// service/log_service/login_log.go
// =============================================================================
// | 包: log_service                                                         |
// | 功能: 提供日志服务相关功能，包括日志记录、查询和管理                     |
// =============================================================================
package log_service

import (
	"blog_server/core"        // 核心功能包 - 提供核心功能支持
	"blog_server/global"      // 全局变量包 - 提供全局访问点
	"blog_server/models"      // 数据模型包 - 提供数据模型定义
	"blog_server/models/enum" // 枚举包 - 提供枚举类型定义
	"blog_server/utils/jwts"  // JWT工具包 - 提供令牌解析功能
	"fmt"                     // 格式化包 - 用于字符串格式化和输出

	"github.com/gin-gonic/gin" // Web框架 - 提供HTTP路由和处理功能
)

// =============================================================================
// | 函数: NewLoginSuccess                                                   |
// | 参数: @c - *gin.Context - Gin上下文对象                                |
// | 参数: @loginType - enum.LoginType - 登录类型                            |
// | 返回: 无                                                                |
// | 功能: 记录用户登录成功的日志                                            |
// | 说明: 创建并保存用户登录成功的日志记录到数据库                          |
// |----------------------------------------------------------------------------|
// | 流程:                                                                   |
// | 1. 获取客户端IP地址和地理位置信息                                       |
// | 2. 从请求中解析JWT令牌获取用户信息                                      |
// | 3. 创建登录成功日志记录，设置相关属性                                   |
// | 4. 将日志记录保存到数据库，失败时输出错误信息                           |
// =============================================================================
func NewLoginSuccess(c *gin.Context, loginType enum.LoginType) {
	// 获取客户端IP地址
	ip := c.ClientIP()
	// 获取IP对应的地理位置
	addr := core.GetIpAddr(ip)

	// 从JWT令牌中获取用户信息
	claims, err := jwts.ParseTokenByGin(c)
	userID := uint(0)
	userName := ""
	if err == nil && claims != nil {
		userID = claims.UserID   // 获取用户ID
		userName = claims.Username // 获取用户名
	}

	// 创建登录日志记录
	log := models.LogModel{
		LogType:     enum.LoginLogType, // 日志类型为登录日志
		Title:       "用户登录",            // 日志标题
		Content:     "登录成功",            // 日志内容
		UserID:      userID,            // 用户ID
		IP:          ip,                // IP地址
		Addr:        addr,              // 地理位置
		LoginStatus: true,              // 登录状态为成功
		Username:    userName,          // 用户名
		Pwd:         "",                // 密码字段留空
		LoginType:   loginType,         // 登录类型
	}

	// 保存日志到数据库
	if err := global.DB.Create(&log).Error; err != nil {
		fmt.Printf("登录日志记录失败: %v\n", err) // 记录保存失败的错误信息
	}
}

// =============================================================================
// | 函数: NewLoginFail                                                      |
// | 参数: @c - *gin.Context - Gin上下文对象                                |
// | 参数: @loginType - enum.LoginType - 登录类型                            |
// | 参数: @msg - string - 登录失败的原因信息                                |
// | 参数: @username - string - 登录的用户名                                  |
// | 参数: @pwd - string - 登录的密码（部分显示）                            |
// | 返回: 无                                                                |
// | 功能: 记录用户登录失败的日志                                            |
// | 说明: 创建并保存用户登录失败的日志记录到数据库                          |
// |----------------------------------------------------------------------------|
// | 流程:                                                                   |
// | 1. 获取客户端IP地址和地理位置信息                                       |
// | 2. 创建登录失败日志记录，设置相关属性和失败原因                         |
// | 3. 将日志记录保存到数据库，失败时输出错误信息                           |
// =============================================================================
func NewLoginFail(c *gin.Context, loginType enum.LoginType, msg string, username string, pwd string) {
	// 获取客户端IP地址
	ip := c.ClientIP()
	// 获取IP对应的地理位置
	addr := core.GetIpAddr(ip)

	// 创建登录失败日志记录
	log := models.LogModel{
		LogType:     enum.LoginLogType, // 日志类型为登录日志
		Title:       "用户登录失败",          // 日志标题
		Content:     msg,               // 失败原因信息
		IP:          ip,                // IP地址
		Addr:        addr,              // 地理位置
		LoginStatus: false,             // 登录状态为失败
		Username:    username,          // 尝试登录的用户名
		Pwd:         pwd,               // 密码信息
		LoginType:   loginType,         // 登录类型
	}

	// 保存日志到数据库
	if err := global.DB.Create(&log).Error; err != nil {
		fmt.Printf("登录日志记录失败: %v\n", err) // 记录保存失败的错误信息
	}
}
